socat -d -d  tcp4-listen:8900,reuseaddr,fork tcp4:10.5.5.10:3389
socat -d -d  tcp4-listen:8901,reuseaddr,fork tcp4:10.120.0.208:3389
socat -d -d  tcp4-listen:8902,reuseaddr,fork tcp4:10.120.0.209:3389
socat -d -d  tcp4-listen:8903,reuseaddr,fork tcp4:10.5.5.10:1433
socat -d -d  tcp4-listen:8904,reuseaddr,fork tcp4:10.5.0.10:3389

socat -d -d  tcp4-listen:8910,reuseaddr,fork tcp4:192.168.168.94:3389
socat -d -d  tcp4-listen:8911,reuseaddr,fork tcp4:10.5.10.8:3389
socat -d -d  tcp4-listen:8912,reuseaddr,fork tcp4:10.5.10.9:22 

socat -d -d  tcp4-listen:80,reuseaddr,fork tcp4:10.5.5.10:8080
------------------------------------------------------------------
211.136.182.237：8888-8912       10.5.0.11:8888-8912
211.136.182.237：3389       10.5.0.83:3389
211.136.182.237：110        10.5.0.10:110
211.136.182.237：25         10.5.0.10:25

                      
211.136.182.237 5972 10.5.0.70 5972                          
211.136.182.237 25999 10.5.0.52 25999 
                       
211.136.182.237 9900 10.5.5.10 9900   
211.136.182.237 9901 10.5.5.20 9901                           
211.136.182.237 8080 10.5.5.10 8080                             
211.136.182.237 1433 10.5.5.11 1433 

211.136.182.237 5972 10.5.0.70  5972
211.136.182.237 25999  10.5.0.52  25999




说起来有点土,事到如今才第一次用socat.
不过今天看了一眼,netcat(nc)这东西ms已经N年没有人维护了.最先有个叫nc110的东西,由于太普及, 以至于人们都不想再去改动它的功能.结果导致多年来没有任何进步…现任的RHEL5里面好像也是由nc110改出来的.另外分支出来一个netcat,这个在google上直接netcat最容易出来,但也好多年没有人动过了…由于这些情况,才使得socat应运而生.虽然它已经生了好多年了,不过我才认识…
用socat试几个netcat常用的用法,对比如下:
1. 听tcp 12345端口
# nc -l 127.0.0.1 12345
# socat tcp-listen:12345 -
2. 向远处tcp 12345端口发点字
# echo “test” | nc 127.0.0.1 12345
# echo “test” | socat - tcp-connect:127.0.0.1:12345
3. 听udp 23456端口
# nc -u -l 127.0.0.1 23456
# socat udp-listen:23456 -
4. 向远处udp 23456端口发点字
# echo “test” | nc -u 127.0.0.1 23456
# echo “test” | socat - udp-connect:127.0.0.1:23456
5. 听unix socket /tmp/unix.socket
# nc -U -l /tmp/unix.socket
netcat没有-U选项
# socat unix-listen:/tmp/unix.socket -
6. 向本地unix socket /tmp/unix.socket发点字
# echo “test” | nc -U /tmp/unix.socket
netcat没有-U选项
# echo “test” | socat - unix-connect:/tmp/unix.sock
7. 听本地unix datagram socket /tmp/unix.dg.sock
nc110搞不定,netcat也搞不定
# socat unix-recvfrom:/tmp/unix.dg.sock -
8. 向本地unix datagram socket /dev/log发点字
nc110搞不定,netcat也搞不定
# echo “test” | socat - unix-sendto:/tmp/unix.dg.sock



－－－－－－－－－－第二篇放一起了－－－－－－－
linux下实现UDP端口映射
原文链接： http://www.hiadmin.com/?tag=socat

一、实际问题
snmp监听端口默认为UPD 161，当监控服务器无法直接访问时，就需要用到端口映射来解决！
同样问题还有dns服务器的UPD 53端口。
二、使用nc来映射UPD端口
假设被监控服务器的IP为192.168.1.1；用于端口映射的主机为某个公网IP如59.1.1.1；需要映射的端口为UDP 161转发端口设为1161（自定义建议1024以上端口）
在端口映射服务器上操作，要安装nc，一般系统都会安装；
【注：nc存在安全漏洞，一定要设定防火墙】
首先使用mkfifo建立管道文件
#mkfifo /tmp/snmpfifo
通过nc建立端口映射 -l为监听模式 -u为UDP -p为本地端口；将内网监控161端口映射到本地的1161端口上；
#nc -l -u -p 1161 < /tmp/snmpfifo | nc -u 192.168.1.1 161 > /tmp/snmpfifo
查看netstat 1161是否监听
#netstat -nlp |grep :1161
udp     0      0 0.0.0.0:1161       0.0.0.0:*          31472/nc

在监控服务器上进行测试是否能采集到数据：
IF-MIB::ifIndex.1 = INTEGER: 1
IF-MIB::ifIndex.2 = INTEGER: 2
IF-MIB::ifIndex.3 = INTEGER: 3
IF-MIB::ifIndex.4 = INTEGER: 4
IF-MIB::ifDescr.1 = STRING: lo
IF-MIB::ifDescr.2 = STRING: eth0
....
#snmpwalk -c public -v2c 59.1.1.1:1161 if

设定成功；这里存在一个问题就是nc监听的端口每次一连接就会挂起，采取一个比较笨的办法就是写个restart.sh脚本放在crontab中每分钟执行一次；
产生该问题的主要原因我在下面讲socat的时候会分析的；
针对snmp采集这样是没有问题，如果dns服务就不行啦！
三、采用nc升级版本的socat来实现UDP端口映射
软件包下载地址：http://www.dest-unreach.org/socat/download/
安装无非就是configure make make install
socat的主要特点就是在两个数据流之间建立通道；且支持众多协议和链接方式：ip, tcp, udp, ipv6, pipe,exec,system,open,proxy,openssl,socket等
这里不一一介绍啦！
有兴趣可以查看官方文档：http://www.dest-unreach.org/socat/doc/socat.html
我们说说如何使用socat建立UPD端口映射
#socat udp4-listen:11161,reuseaddr,fork UDP:[监控服务器IP]:161
udp4-listen：在本地建立的是一个udp ipv4协议的监听端口；
reuseaddr，绑定本地一个端口；
fork，设定多链接模式，即当一个链接被建立后，自动复制一个同样的端口再进行监听；

【注：nc就是因为缺少fork模式，所以每次监听只能处理一次连接】
socat是一个强大的软件，希望与有这方面需求的同仁一起学习这个好的工具！
ps：无论是nc方式还是socat方式，启动监听模式都是在前端占用一个shell，所以请在后台执行或者使用screen工具等等！



附：
socat官方文档：http://www.dest-unreach.org/socat/doc/socat.html

-------------------

    socat是一個netcat(nc)的替代產品，可以稱得上nc++。socat的特點就是在兩個流之間建立一個雙向的通道。socat的地址類型很 多，有ip, tcp, udp, ipv6, pipe,exec,system,open,proxy,openssl,等等。看一個例子：

    c:\>socat - tcp:192.168.1.18:80

    這個命令等同於 nc 192.168.1.18 80。 socat裡面，必須有兩個流，所以第一個參數-代表標準的輸入輸出，第二個流連接到192.168.1.18的80端口。再看一個反向telnet的例子：

    on server:
    c:\>socat tcp-listen:23 exec:cmd,pty,stderr

    這個命名把cmd綁定到端口23，同時把cmd的Stderr重定向到stdout。

    on client:
    c:\>socat readline tcp:server:23

    連接到服務器的23端口，即可獲得一個cmd shell。readline是gnu的命令行編輯器，具有歷史功能。

    再看文件傳遞的例子。nc也經常用來傳遞文件，但是nc有一個缺點，就是不知道文件什麼時候傳完了，一般要用Ctrl+c來終止，或者估計一個時間，用-w參數來讓他自動終止。用socat就不用這麼麻煩了：

    on host 1:
    c:\>socat -u open:myfile.exe,binary tcp-listen:999

    on host 2:
    c:\>socat -u tcp:host1:999 open:myfile.exe,create,binary

    這個命令把文件myfile.exe用二進制的方式，從host 1 傳到host 2。-u 表示數據單向流動，從第一個參數到第二個參數，-U表示從第二個到第一個。文件傳完了，自動退出。

    再來一個大家喜歡用的例子。在一個NAT環境，如何從外部連接到內部的一個端口呢？只要能夠在內部運行socat就可以了。

    外部：
    c:\>socat tcp-listen:1234 tcp-listen:3389

    內部：
    c:\>socat tcp:outerhost:1234 tcp:192.168.12.34:3389

    這樣，你外部機器上的3389就影射在內部網192.168.12.34的3389端口上。

    socat還具有一個獨特的讀寫分流功能，比如：

    c:\>socat open:read.txt!!open:write.txt,create,append tcp-listen:80,reuseaddr,fork

    這個命令實現一個假的web server，客戶端連過來之後，就把read.txt裡面的內容發過去，同時把客戶的數據保存到write.txt裡面。”！！”符號用戶合併讀寫流，前面的用於讀，後面的用於寫。

